#ifndef _SEQLIST_H_
#define _SEQLIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define USERNAME_SIZE 20			//用户名大小
#define PASSWORD_SIZE 24			//密码长度
#define GENDER_SIZE 8				//性别大小
#define NAME_SIZE 20				//联系人姓名大小
#define ADDRES_SIZE 100				//家庭住址长度
#define SEQ_SIZE 1000				//顺序表最大长度

typedef long lType;

typedef struct 
{
    long userId;					//电话号码	此为唯一标识
    int state;						//登录状态	登录：1 登出 0
    char userName[USERNAME_SIZE];	//用户名	可以重复
    char password[PASSWORD_SIZE];	//密码		不多于23个字符
}UserType, *PUserType;				//用户信息

typedef struct 
{
    long userId;					//用户电话号 关联用户表的标识符
    long contactId;					//联系电话
    char name[NAME_SIZE];			//联系人姓名 
    char gender[GENDER_SIZE];		//性别 1:男 0：女
    int age;						//年龄 
    char addres[ADDRES_SIZE];		//家庭住址
}ContactType, *PContactType;		//返回通信录表

typedef union
{
	ContactType  contactInfo;		//返回通信录表
	UserType userInfo;				//表示查询到的用户信息
}ElementType, *PElementType, ArgVal, ResultVal;		//重定义顺序表中元素类型

typedef struct
{
	ElementType *data;
	int last;//last代表的是数组中最后一个有效元素的下标,-1代表空状态，0代表第一个有效元素
	int capacity;//当前容量
}SeqListType, *PSeqListType;

//显示用户信息
void ShowUserInfo(UserType user);

/*
	参数：
		lines 0：单行显示 1：多行显示
		contactInfo 联系人的信息
	功能：显示联系人信息
*/
void ShowContactInfo(int lines, ContactType contactInfo);

//.遍历顺序表sequence 顺序list表
// 参数：argType 0 显示用户表信息， 1显示通信录表信息
void ShowSeqlist(const SeqListType * const p, int argType);

/*
	功能：创建一个空的顺序表
	参数：void
	返回值：返回的是申请空间的首地址
*/
SeqListType *CreateEpSeqlist();//返回的是申请空间的首地址

/*
	功能：向顺序表的指定位置插入数据
	参数：seqlist_t *p	p顺序表在内存中的地址,非空NULL
		  int post		post第几个位置，下标从0开始，范围[0, last + 1] last 最后一个有效元素的下标
		  ElementType data		data插入的数据
	返回值：插入是否成功，成功返回1，失败返回-1,对数据的改动操作时,应当判断执行操作是否成功
*/
int InsertIntoSeqlist(SeqListType *p, int post, ElementType data);//post第几个位置，data插入的数据

//.判断顺序表是否为满,满返回１　未满返回０
int IsFullSeqlist(const SeqListType * const p);

//.判断顺序表是否为空
int IsEpSeqlist(const SeqListType * const p);

//.删除顺序表中指定位置的数据 post删除位置
int DeletePostSeqlist(SeqListType *p, int post);

//.清空顺序表
void ClearSeqList(SeqListType *p);

//.修改指定位置的数据
int ChangePostSeqList(SeqListType *p, int post, ElementType data);//post被修改的位置，data修改成的数据

//.查找指定数据出现的位置
int SearchDataSeqList(const SeqListType * const p, ElementType data);//data代表被查找的数据

//.释放空间
void MyFree(PSeqListType *q);

//.对顺序表进行排序
//void MySort(SeqListType *p);
#endif